package day0303;

/**
 * 栈:
 *   1. 入栈
 *   2. 出栈
 *   3. 大小
 *   4. 栈顶元素
 *   5. 是否空
 *   6. 查找元素
 */
public class MyStack {

    /**
     * 存元素的数组
     */
    private Object[] objs;

    /**
     * 存储元素的个数
     */
    private int size;

    private static final int DEFAULT_LENGTH = 10;

    public MyStack() {
        objs = new Object[DEFAULT_LENGTH];
    }

    public MyStack(int size) {
        if (size < 0) {
            throw new IllegalArgumentException("栈的大小不能为负数：" + size);
        }
        objs = new Object[size];
    }

    /**
     * 入栈
     * @param element
     * @return
     */
    public Object push(Object element) {
        if ((size + 1) == objs.length) {
            // 扩容
            grow();
        }
        objs[size ++] = element;
        return element;
    }

    private void grow() {
        Object[] newArr = new Object[objs.length + 10];

        System.arraycopy(objs, 0, newArr, 0, objs.length);

        objs = newArr;
    }

    /**
     * 删除栈顶元素，并返回
     * @return
     */
    public Object pop() {
        check();
        // 栈顶元素取出来
        Object obj = objs[size - 1];
        // 栈顶元素删除
        objs[-- size] = null; // GC
        return obj;
    }

    private void check(){
        if (isEmpty()) {
            throw new RuntimeException("栈中没有元素");
        }
    }


    /**
     * 元素的个数
     * @return
     */
    public int size() {
        return this.size;
    }


    /**
     * 返回栈顶元素
     * @return
     */
    public Object peek() {
        check();
        return objs[size - 1];
    }

    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 查找元素
     * @param obj
     * @return
     */
    public int search(Object obj) {
        for (int i = 0; i < size; i++) {
            if (objs[i] == null) {
                if (objs[i] == obj) {
                    return i;
                }
            } else if (objs[i].equals(obj)){
                return i;
            }
        }
        return -1;
    }



}
